package 线程.线程同步;
/*
    关键字synchronized来与对象的互斥锁联系，当某个对象用synchronized修饰时，表明
    该对象在任一时刻只能由一个线程访问

    同步的局限性：导致程序的执行效率降低
    同步方法(非静态的)的锁可以是this，也可以是其他对象(要求同一个对象)
    同步方法(静态的)的锁为当前类本身

    多个线程的锁对象必须为同一个
 */
public class ticket {
    public static void main(String[] args) {
        ticket2 test1 = new ticket2();
        new Thread(test1).start();
        new Thread(test1).start();
        new Thread(test1).start();
    }

}
class ticket2 implements Runnable{
    private static int nums = 300;
    private boolean loop = true;
    public void sell(){
        synchronized (this) {
            if (nums <= 0) {
                System.out.println("窗口" + Thread.currentThread().getName() + "票已经售完");
                loop = false;
                return;
            }
            try {
                Thread.sleep(80);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口 " + Thread.currentThread().getName() + "卖了一张票"
                    + "\t剩余 " + --nums + "张票");
        }
    }
    @Override
    public void run() {
        while (loop){
            sell();
        }

    }
}
